package syg._02_activiti_deployment;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.repository.Deployment;
import org.junit.Test;

/**
 * @author SYG
 * <p>
 * ###
 * <p>
 * service名称        | service作用
 * ----------------- | ------------------------
 * RepositoryService | activiti的资源管理类     ,提供了管理和控制流程发布包和流程定义的操作
 * RuntimeService    | activiti的流程运行管理类  ,获取很多关于流程执行相关的信息
 * TaskService       | activiti的任务管理类      ,从这个类中获取任务的信息。
 * HistoryService    | activiti的历史管理类      ,查询历史信息，执行流程时，引擎会保存很多数据（根据配置），比如流程实例启动时间，任务的参与者， 完成任务的时间，每个流程实例的执行路径
 * ManagerService    | activiti的引擎管理类      ,提供了对 Activiti 流程引擎的管理和维护功能
 */
public class _01_Deployment {

    /**
     * 测试流程部署(为什么同样的流程定义可以部署多次呢)
     *      解析bpmn文件并入库
     *
     *      1,act_re_deployment : 流程部署表,每部署一次会增加一条记录
     *      2,ACT_RE_PROCDEF    : 流程定义表,同样的流程可以部署多次,部署id不同
     *      3,act_ge_bytearray  : 流程资源表, 资源与流程定义一一对应
     *
     *      总结 : act_re_deployment 与 ACT_RE_PROCDEF 是一对多的关系(如一个zip包中多个bpmn文件)
     */
    @Test
    public void test1() {
        // 1,创建ProcessEngine
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        // 2,获取RepositoryService实例(因为我们要部署流程,部署流程相关的service是RepositoryService)
        RepositoryService repositoryService = processEngine.getRepositoryService();
        // 3,使用RepositoryService进行部署(部署什么呢？自然是部署bpmn文件与png文件呀,其实就是解析bpmn文件,png文件应该就是方便查看的作用,故而截图也是可以的)
        Deployment deployment = repositoryService.createDeployment()
                // 流程的名字
                .name("出差申请流程")
                // 部署bpmn资源(当然也提供其他部署方式,因为这是单个文件,如果文件很多怎么办？)
                .addClasspathResource("bpmn/evection.bpmn")
                // 部署png资源(比如使用io流部署,使用bpmn modle部署),不能使用截图,截图会报错
                .addClasspathResource("bpmn/evection.png")
                // cvc-complex-type.2.4.a: 发现了以元素 'process' 开头的无效内容。  先屏蔽掉这个错误
                .disableSchemaValidation()
                .deploy();

        // 4、输出部署信息(部署完毕,自然可以获取流程的信息)
        System.out.println("流程部署id=" + deployment.getId());
        System.out.println("流程名=" + deployment.getName());
        // 这里获取不到key,流程key与流程定义的key含义不一样吗？
        System.out.println("流程key=" + deployment.getKey());
        System.out.println("流程版本号=" + deployment.getVersion());

    }
}
